// generic hash table

typedef struct table table;

table* T_empty(); // create an empty hash table
// indicate whether the 'key' occurs in the 'tab'
int T_count(table* tab, void* key);
// look up the value corresponding to 'key' in the 'tab'
void* T_look(table* tab, void* key); 
// insert a pair {'key', 'value'} into the 'tab'
void T_insert(table* tab, void* key, void* value);
void T_remove(table* tab, void* key); // remove the 'key' in the 'tab' 
void T_clear(table* tab); // clear the memory about 'tab'
// apply the 'func' onto all the values mapped in the 'tab'
void T_dump(table* tab, void (*func)(void *value));
